﻿using System;
using System.Collections.Generic;

namespace Matrix.Common.Utility
{
    /// <summary>
    /// 公共帮助类
    /// </summary>
    public static class CommonHelper
    {
        /// <summary>
        /// 通过GUID获取随机字符串（不带“-”）
        /// </summary>
        /// <param name="length">所需字符串长度（最长32）</param>
        public static string GetGuidKey(int length = 32)
        {
            if (length > 32)
            {
                length = 32;
            }
            return Guid.NewGuid().ToString().Replace("-", "").Substring(0, length);
        }

        /// <summary>
        /// 检测生成的随机数是否有重复，如果取出来的数字和已取得的数字有重复就重新随机获取
        /// 值得注意的是要用一同一个随机数实例生成，所以ra要作为参数传入getNum中，否则生成的数字会有重复
        /// </summary>
        /// <param name="arrNum"></param>
        /// <param name="tmp"></param>
        /// <param name="minValue"></param>
        /// <param name="maxValue"></param>
        /// <param name="ra"></param>
        /// <returns></returns>
        private static int GetNum(int[] arrNum, int tmp, int minValue, int maxValue, Random ra)
        {
            int n = 0;
            while (n <= arrNum.Length - 1)
            {
                if (arrNum[n] == tmp) //利用循环判断是否有重复
                {
                    tmp = ra.Next(minValue, maxValue); //重新随机获取。
                    GetNum(arrNum, tmp, minValue, maxValue, ra);//递归:如果取出来的数字和已取得的数字有重复就重新随机获取。
                }
                
            }
            return tmp;
        }

        /// <summary>
        /// 获取随机数组
        /// 在区间[minValue,maxValue]取出num个互不相同的随机数，返回的数组包含着结果
        /// </summary>
        /// <param name="num"></param>
        /// <param name="minValue"></param>
        /// <param name="maxValue"></param>
        /// <returns></returns>
        public static int[] GetRandomNum(int num, int minValue, int maxValue)
        {
            Random ra = new Random(unchecked((int)DateTime.Now.Ticks));
            int[] arrNum = new int[num];
            int tmp = 0;
            for (int i = 0; i <= num - 1; )
            {
                tmp = ra.Next(minValue, maxValue); //随机取数
                arrNum[i] = GetNum(arrNum, tmp, minValue, maxValue, ra); //取出值赋到数组中
            }
            return arrNum;
        }


        public static IEnumerable<TSource> DistinctBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
        {
            HashSet<TKey> seenKeys = new HashSet<TKey>();
            foreach (TSource element in source)
            {
                if (seenKeys.Add(keySelector(element)))
                {
                    yield return element;
                }
            }
        }
    }
}
